import base64
from Crypto.Cipher import AES

class EncryptDate:
    def __int__(self, key):
        self.key = key.encode("utf-8") # 初始化密钥
        # 点击block_size查看源代码，可知大小为16
        self.length = AES.block_size # 初始化数据块大小
        self.aes = AES.new(self.key,AES.MODE_ESB) # 初始化AES,ESB模式的实例，可以选择其他模式
        # 截断函数，去除填充的字符
        self.unpad = lambda date:date[0:-ord(date[-1])]


    def pad(self,text):
        """
        # 填充函数，使被加密数据的字节码长度是block_size的整数倍
        :param text:
        :return:
        """
        count = len(text.encode("utf-8"))
        # add为缺少位数，方便下面进行补位
        add =self.length - (count % self.length)
        # chr函数和ord函数经常一起出现，互为反函数
        # char()是用于补位
        entext = text + (chr(add) * add)
        return entext

    def encrypt(self,encrData): # 加密函数
        res = self.aes.encrypt(self.pad(encrData).encode("utf-8"))
        # base64是网络上最常见的用于传输88bit字节码的编码方式之一
        msg = str(base64.b64encode(res),encoding="utf-8")
        return msg

    def dencrypt(self,dencrData): # 解密函数
        res = base64.decodebytes(dencrData.encode("utf-8"))
        msg = self.aes.decrypt(res).decode("utf-8")
        # 返回的时候，去除填充字符
        return self.unpad(msg)

if __name__ == '__main__':
    ed = EncryptDate()




